//
//  determinant.c
//  linear_algebra
//
//  Created by zhangnan on 2025/3/19.
//

#include "determinant.h"

// 初始化行列式(double)
DETERMINANT_DOUBLE_TYPE new_double_determinant(double * arr,int rows){
    DETERMINANT_DOUBLE_TYPE result;
    result.array=arr;
    result.rows=rows;
    return result;
}


// 初始化行列式(int)
DETERMINANT_INT_TYPE new_int_determinant(int * arr,int rows){
    DETERMINANT_INT_TYPE result;
    result.array=arr;
    result.rows=rows;
    return result;
}

/*
 计算double类型 第一行第index项的 余子式
 */
void cal_lower_double_determinant(double *result,DETERMINANT_DOUBLE_TYPE param,int index){
    int count=0;
    for(int i=0;i<param.rows;i++){
        if(i!=0){
            for(int j=0;j<param.rows;j++){
                if(j!=index){
                    result[count]=param.array[i*param.rows+j];
                    count++;
                }
            }
        }
    }
}


/*
 计算int类型 第一行第index项的 余子式
 */
void cal_lower_int_determinant(int *result,DETERMINANT_INT_TYPE param,int index){
    int count=0;
    for(int i=0;i<param.rows;i++){
        if(i!=0){
            for(int j=0;j<param.rows;j++){
                if(j!=index){
                    result[count]=param.array[i*param.rows+j];
                    count++;
                }
            }
        }
    }
}


/**
 根据行列序号获取行列式中的值（double）
 */
double get_double_determinant_value(DETERMINANT_DOUBLE_TYPE param,int rowIndex,int colIndex){
    return param.array[param.rows*rowIndex+colIndex];
}

/**
 根据行列序号获取行列式中的值（int）
 */
double get_int_determinant_value(DETERMINANT_INT_TYPE param,int rowIndex,int colIndex){
    return param.array[param.rows*rowIndex+colIndex];
}
